/**
 * fileReader2.js - 使用 fs.open/fs.read/fs.close 读取文件并通过HTTP返回
 * 要求：
 * 1) 监听 8081 端口
 * 2) 运行时可传文件名参数：node 2.js <文件名>
 * 3) 若传入且文件存在：读取并在浏览器显示；不存在则提示错误
 * 4) 未传入时：默认读取当前脚本（2.js）内容
 */

const http = require('http');
const fs = require('fs');
const path = require('path');

const port = 8081;

const cliFilename = process.argv[2];
const defaultFile = __filename; // 当前脚本
const targetPath = path.join(__dirname, cliFilename || path.basename(defaultFile));

function readFileWithLowLevelApis(filePath, callback) {
  // 先尝试打开文件
  fs.open(filePath, 'r', (openErr, fd) => {
    if (openErr) {
      callback(new Error(`无法打开文件: ${filePath} (${openErr.message})`));
      return;
    }

    // 获取文件大小以便分配缓冲区
    fs.fstat(fd, (statErr, stats) => {
      if (statErr) {
        fs.close(fd, () => {});
        callback(statErr);
        return;
      }

      const fileSize = stats.size;
      const buffer = Buffer.allocUnsafe(fileSize || 1);

      // 从偏移0开始读取全部内容
      fs.read(fd, buffer, 0, fileSize, 0, (readErr, bytesRead) => {
        fs.close(fd, () => {});
        if (readErr) {
          callback(readErr);
          return;
        }
        callback(null, buffer.toString('utf8', 0, bytesRead));
      });
    });
  });
}

const server = http.createServer((req, res) => {
  if (req.url !== '/') {
    res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end('404 Not Found');
    return;
  }

  readFileWithLowLevelApis(targetPath, (err, content) => {
    if (err) {
      res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
      res.end(`读取失败：${err.message}`);
      return;
    }
    res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end(content);
  });
});

server.listen(port, () => {
  console.log(`服务已启动：http://localhost:${port}/`);
  if (cliFilename) {
    console.log(`将使用低层API读取文件: ${targetPath}`);
  } else {
    console.log('未提供文件名参数，默认返回当前脚本内容');
  }
});


